#include <iostream>
#include <vector>
#include <string>
#include <unistd.h>
#include <signal.h>
#include <sys/resource.h>
// #include <jsoncpp/json/json.h>
// #include <boost/algorithm/string.hpp>
#include <ctemplate/template.h>
// using namespace std;

/******************************
 * 测试ctemplate库的网页渲染功能
 * 
 ******************************/
int main()
{
    std::string in_html = "./test.html";
    std::string value = "this is a test html";

    // 形成数据字典
    ctemplate::TemplateDictionary root("test");     // unorder_map<> test;
    root.SetValue("key", value);                    // test[key] = value;

    // 获取被渲染网页对象
    // DO_NOT_STRIP: 保持原貌
    ctemplate::Template* tpl = ctemplate::Template::GetTemplate(in_html, ctemplate::DO_NOT_STRIP);
   
    // 添加数据字典到网页
    std::string out_html;
    tpl->Expand(&out_html, &root);

    std::cout << out_html << std::endl;

    return 0;
}



#ifdef BOOST_SPLIT
/******************************
 * 测试boost库的split字符串分隔
 * 
 ******************************/
int main()
{
    std::vector<std::string> tokens;                // 切分后的存储容器
    const std::string str = "1 判断回文数     简单 1 64";
    const std::string sep = " ";
    // is_any_of(sep): 遇到分隔字符串中的每个字符都做分隔
    // token_compress_on: 当遇到连续分隔符时，压缩为一个处理(即不分隔出来一个空串)
    boost::split(tokens, str, boost::is_any_of(sep), boost::algorithm::token_compress_on);

    for(auto& str : tokens)
        std::cout << str << "\n";

    return 0;
}
#endif



/**************************
 * 测试资源限制
 * 
 * ************************/
#ifdef RLIMIT
void handler(int signo)
{
    std::cout << "signo : " << signo << std::endl;
    exit(1);
}

int main()
{
    //资源不⾜，OS是通过信号终⽌进程的
    for(int i = 1; i <= 31; i++) signal(i, handler);

    // CPU限制 
    // struct rlimit r;
    // r.rlim_cur = 1;     // 实际资源上限
    // r.rlim_max = RLIM_INFINITY;     // 无穷大(资源限制阈值)
    // setrlimit(RLIMIT_CPU, &r);
    // while (1)
    // {
    //     /* code */
    // }
    
    // 内存限制
    struct rlimit r;
    r.rlim_cur = 1024 * 1024 * 64;  // 64MB
    r.rlim_max = RLIM_INFINITY;
    setrlimit(RLIMIT_AS, &r);
    int cnt = 0;
    while (1)
    {
        int* p = new int[1024 * 1024 * 4];  // 一秒钟申请4MB
        ++cnt;
        cout << cnt << "\n";
        sleep(1);
    }
    return 0;
}
#endif